package Leetcode;

/**
 * @Author piper
 * @Date 2019/10/22 4:16 下午
 */
public class 力扣67_二进制求和 {

    /**
     * 自己根据二进制特性 使用 取余和除得到结果
     */
    static String addBinary1(String a, String b) {
        StringBuilder res = new StringBuilder();
        int c = 0; //进位
        // 以最长的字符循环
        for (int i = a.length() - 1, j = b.length() - 1; i >= 0 || j >= 0; i--, j--) {
            int c1 = 0, c2 = 0; //默认两位为0
            if (i >= 0) c1 = a.charAt(i) - '0';
            if (j >= 0) c2 = b.charAt(j) - '0';

            //计算数据 将两位字符和进位异或 得到一位数据
            int i1 = c1 + c2 + c;
            res.append(i1 % 2);
            //计算进位 将两位数字和进位加上 大于1就要进位
            //减去96是因为'0'为48、'1'为49
            c = i1 / 2;
        }
        //加上最后一个进位
        if (c == 1) res.append(1);
        return res.reverse().toString();
    }

    /**
     * 上一解法的改版 根据按位异或的特性解题
     */
    static String addBinary2(String a, String b) {
        StringBuilder res = new StringBuilder();
        int c = 0; //进位
        // 以最长的字符循环
        for (int i = a.length() - 1, j = b.length() - 1; i >= 0 || j >= 0; i--, j--) {
            char c1 = '0', c2 = '0'; //默认两位为0
            if (i >= 0) c1 = a.charAt(i);
            if (j >= 0) c2 = b.charAt(j);

            //计算数据 将两位字符和进位异或 得到一位数据
            res.append(c1 ^ c2 ^ c);
            //计算进位 将两位数字和进位加上 大于1就要进位
            //减去96是因为'0'为48、'1'为49
            if (c1 + c2 + c - 96 > 1) {
                c = 1;
            } else {
                c = 0;
            }
        }
        //加上最后一个进位
        if (c == 1) res.append(1);
        return res.reverse().toString();
    }

    public static void main(String[] args) {
        System.out.println(addBinary1("1010", "11011"));
    }
}
